package com.kexio.dynamic.datasource.service;

/**
 * 数据源切换服务接口
 * 
 * 提供数据源的切换和管理功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface DataSourceSwitchService {

    /**
     * 切换到指定数据源
     * 
     * @param dataSourceName 数据源名称
     */
    void switchTo(String dataSourceName);

    /**
     * 切换到主库
     */
    void switchToMaster();

    /**
     * 切换到从库
     */
    void switchToSlave();

    /**
     * 切换到租户数据源
     * 
     * @param tenantId 租户ID
     */
    void switchToTenant(Long tenantId);

    /**
     * 获取当前数据源
     * 
     * @return 当前数据源名称
     */
    String getCurrentDataSource();

    /**
     * 重置为默认数据源
     */
    void reset();

    /**
     * 清除当前线程的数据源设置
     */
    void clear();

    /**
     * 检查数据源是否存在
     * 
     * @param dataSourceName 数据源名称
     * @return 是否存在
     */
    boolean exists(String dataSourceName);

    /**
     * 获取默认数据源名称
     * 
     * @return 默认数据源名称
     */
    String getDefaultDataSource();

    /**
     * 是否是主库
     * 
     * @param dataSourceName 数据源名称
     * @return 是否是主库
     */
    boolean isMaster(String dataSourceName);

    /**
     * 是否是从库
     * 
     * @param dataSourceName 数据源名称
     * @return 是否是从库
     */
    boolean isSlave(String dataSourceName);

    /**
     * 是否是租户库
     * 
     * @param dataSourceName 数据源名称
     * @return 是否是租户库
     */
    boolean isTenant(String dataSourceName);

    /**
     * 获取所有可用的数据源名称
     * 
     * @return 数据源名称集合
     */
    java.util.Set<String> getAvailableDataSources();

    /**
     * 获取所有从库名称
     * 
     * @return 从库名称集合
     */
    java.util.Set<String> getSlaveDataSources();

    /**
     * 选择一个从库（负载均衡）
     * 
     * @return 从库名称
     */
    String selectSlave();

    /**
     * 根据策略选择从库
     * 
     * @param strategy 负载均衡策略
     * @return 从库名称
     */
    String selectSlave(String strategy);

    /**
     * 解析数据源表达式
     * 支持SpEL表达式，如: "tenant_${tenantId}"
     * 
     * @param expression 数据源表达式
     * @return 解析后的数据源名称
     */
    String resolveDataSourceExpression(String expression);
}
